package com.haoshuang.zhouzhoubang.ui.adapter

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter

/**
 * ViewPager适配器
 * @param fm 上下文是Activity传supportFragmentManager,上下文是Fragment传parentFragmentManager
 * @param fragments Fragment集合
 * @param mTitles 标题集合
 * */
class MyPagerAdapter2 (fm: FragmentManager, val fragments: ArrayList<Fragment>, val mTitles: Array<String>) :
    FragmentPagerAdapter(fm) {
    /*
    * 该函数被调用后，会对 Fragment 进行 FragmentTransaction.detach()。
    * 这里不是 remove()，只是 detach()，因此 Fragment 还在 FragmentManager 管理中，Fragment 所占用的资源不会被释放。
    * */
    override fun getCount(): Int {
        return fragments.size
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mTitles[position]
    }

    /*
     * 该类中新增的一个虚函数。
     * 函数的目的为生成新的 Fragment 对象。重载该函数时需要注意这一点。在需要时，该函数将被 instantiateItem() 所调用。
     * 如果需要向 Fragment 对象传递相对静态的数据时，我们一般通过 Fragment.setArguments() 来进行，这部分代码应当放到 getItem()。
     * 它们只会在新生成 Fragment 对象时执行一遍。
     * 如果需要在生成 Fragment 对象后，将数据集里面一些动态的数据传递给该 Fragment，那么，这部分代码不适合放到 getItem() 中。
     * 因为当数据集发生变化时，往往对应的 Fragment 已经生成，如果传递数据部分代码放到了 getItem() 中，这部分代码将不会被调用。
     * 这也是为什么很多人发现调用 PagerAdapter.notifyDataSetChanged() 后，getItem() 没有被调用的一个原因。*/
    override fun getItem(position: Int): Fragment {
        return fragments[position]
    }
}